package ranking;


public class Shell {
	public static int[] a={10,32,1,9,5,7,12,0,1,68,34,64};
	public static void main(String args[]){
		int i;//循环计数变量
		int Index=a.length;//数据索引变量
		System.out.println(Index);
		System.out.println("排序前：");
		for(i=0; i<Index;i++)
			System.out.println(a[i]);
		ShellSort(Index);//选择排序
		//排序后结果
		System.out.println("排序后：");
		for(i=0;i<Index;i++)
			System.out.println(a[i]);
	}
	public static void ShellSort(int Index){
		int j,k;//循环计数变量
		int Temp;//暂存变量
		boolean Change;//数据是否改变
		int DataLength;//分割集合的间隔长度
		int Pointer;//进行处理的位置
		DataLength=(int)Index/2;//初始集合间隔长度
		int count=0;
		while(DataLength!=0)//数列仍可进行分割
		{
			//对各个集合进行处理
			
			for(j=DataLength;j<Index;j++){
				Change=false;
				Temp=a[j];//暂存Data[j]的值，待交换时使用
				Pointer=j-DataLength;//计算进行处理的位置
				
				//进行集合内数值的比较与交换值
				while(Temp<a[Pointer]&&Pointer>=0&&Pointer<=Index){
					a[Pointer+DataLength]=a[Pointer];
					//计算下一个欲进行处理的位置
					Pointer=Pointer-DataLength;
					Change=true;
					if(Pointer<0||Pointer>Index)
						break;
				}
				//与最后的数值交换
				a[Pointer+DataLength]=Temp;
				
				if(Change){
					//打印目前排序结果
					System.out.println("排序中：");
					for(k=0;k<Index;k++)
						System.out.println(a[k]);
					count++;//统计排序的次数
				}
				
			}
			
			DataLength=DataLength/2;//计算下次分割的间隔长度
			
		}
		System.out.println("排序次数为："+count);//打印排序的次数
	}
	
}